package com.ww.book.javaconcurrencyinpractice.ch03;

/**
 * 问题分析
 * 1.在ThisEscape中，构造函数完成之前，this引用已经通过匿名内部类逃逸；
 * 2.其他线程可能在value被初始化为42之前就调用doSomething方法；
 * 3.结果可能输出Value=0，而不是42。
 */
public class ThisEscape {

    private int value;

    public ThisEscape(EventSource source) {
        // 在构造函数中注册监听器，导致this引用逃逸
        source.registerListener(this::doSomething);

        // 模拟耗时的初始化操作
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        value = 42; // 重要初始化操作
    }

    private void doSomething(Event e) {
        // 这里可能看到value=0，而不是42
        System.out.println(value);
    }

    // 打印结果：0
    public static void main(String[] args) {
        new ThisEscape(new EventSource());
    }
}

// 事件源类
class EventSource {
    public void registerListener(EventListener listener) {
        // 可能立即触发事件，或者在另一个线程中触发
        new Thread(() -> {
            try {
                Thread.sleep(100); // 模拟稍后触发事件
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            listener.onEvent(new Event());
        }).start();
    }
}

interface EventListener {
    void onEvent(Event e);
}

class Event {}